@dxos/react-ui-editor 0.8.1-main.ae460ac → 0.8.1-staging.391c573
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/lib/browser/index.mjs +122 -114
- package/dist/lib/browser/index.mjs.map +3 -3
- package/dist/lib/browser/meta.json +1 -1
- package/dist/lib/node/index.cjs +123 -116
- package/dist/lib/node/index.cjs.map +3 -3
- package/dist/lib/node/meta.json +1 -1
- package/dist/lib/node-esm/index.mjs +122 -114
- package/dist/lib/node-esm/index.mjs.map +3 -3
- package/dist/lib/node-esm/meta.json +1 -1
- package/dist/types/src/InputMode.stories.d.ts +3 -2
- package/dist/types/src/InputMode.stories.d.ts.map +1 -1
- package/dist/types/src/TextEditor.stories.d.ts +34 -33
- package/dist/types/src/TextEditor.stories.d.ts.map +1 -1
- package/dist/types/src/components/EditorToolbar/EditorToolbar.d.ts +2 -1
- package/dist/types/src/components/EditorToolbar/EditorToolbar.d.ts.map +1 -1
- package/dist/types/src/extensions/automerge/automerge.stories.d.ts +4 -3
- package/dist/types/src/extensions/automerge/automerge.stories.d.ts.map +1 -1
- package/dist/types/src/extensions/folding.d.ts +8 -2
- package/dist/types/src/extensions/folding.d.ts.map +1 -1
- package/dist/types/src/extensions/selection.d.ts +1 -6
- package/dist/types/src/extensions/selection.d.ts.map +1 -1
- package/dist/types/src/hooks/useTextEditor.d.ts +3 -3
- package/dist/types/src/hooks/useTextEditor.d.ts.map +1 -1
- package/package.json +28 -28
- package/src/TextEditor.stories.tsx +2 -10
- package/src/extensions/folding.tsx +73 -30
- package/src/extensions/selection.ts +21 -41
- package/src/hooks/useTextEditor.ts +17 -8
@@ -2053,9 +2053,6 @@ import { isNonNullable } from "@dxos/util";
|
|
2053
2053
|
import { Transaction } from "@codemirror/state";
|
2054
2054
|
import { EditorView as EditorView8, keymap as keymap4 } from "@codemirror/view";
|
2055
2055
|
import { debounce } from "@dxos/async";
|
2056
|
-
import { invariant as invariant3 } from "@dxos/invariant";
|
2057
|
-
import { isNotFalsy as isNotFalsy2 } from "@dxos/util";
|
2058
|
-
var __dxlog_file6 = "/home/runner/work/dxos/dxos/packages/ui/react-ui-editor/src/extensions/selection.ts";
|
2059
2056
|
var documentId = singleValueFacet();
|
2060
2057
|
var stateRestoreAnnotation = "dxos.org/cm/state-restore";
|
2061
2058
|
var createEditorStateTransaction = ({ scrollTo, selection }) => {
|
@@ -2068,34 +2065,10 @@ var createEditorStateTransaction = ({ scrollTo, selection }) => {
|
|
2068
2065
|
annotations: Transaction.userEvent.of(stateRestoreAnnotation)
|
2069
2066
|
};
|
2070
2067
|
};
|
2071
|
-
var
|
2072
|
-
|
2073
|
-
|
2074
|
-
|
2075
|
-
L: 47,
|
2076
|
-
S: void 0,
|
2077
|
-
A: [
|
2078
|
-
"id",
|
2079
|
-
""
|
2080
|
-
]
|
2081
|
-
});
|
2082
|
-
const state = localStorage.getItem(`${keyPrefix}/${id}`);
|
2083
|
-
return state ? JSON.parse(state) : void 0;
|
2084
|
-
},
|
2085
|
-
setState: (id, state) => {
|
2086
|
-
invariant3(id, void 0, {
|
2087
|
-
F: __dxlog_file6,
|
2088
|
-
L: 53,
|
2089
|
-
S: void 0,
|
2090
|
-
A: [
|
2091
|
-
"id",
|
2092
|
-
""
|
2093
|
-
]
|
2094
|
-
});
|
2095
|
-
localStorage.setItem(`${keyPrefix}/${id}`, JSON.stringify(state));
|
2096
|
-
}
|
2097
|
-
});
|
2098
|
-
var selectionState = ({ getState, setState } = {}) => {
|
2068
|
+
var selectionState = (state = {}) => {
|
2069
|
+
const setState = (id, selectionState2) => {
|
2070
|
+
state[id] = selectionState2;
|
2071
|
+
};
|
2099
2072
|
const setStateDebounced = debounce(setState, 1e3);
|
2100
2073
|
return [
|
2101
2074
|
// TODO(burdon): Track scrolling (currently only updates when cursor moves).
|
@@ -2109,41 +2082,39 @@ var selectionState = ({ getState, setState } = {}) => {
|
|
2109
2082
|
if (!id || transactions.some((tr) => tr.isUserEvent(stateRestoreAnnotation))) {
|
2110
2083
|
return;
|
2111
2084
|
}
|
2112
|
-
|
2113
|
-
|
2114
|
-
|
2115
|
-
|
2116
|
-
|
2085
|
+
const { scrollTop } = view.scrollDOM;
|
2086
|
+
const pos = view.posAtCoords({
|
2087
|
+
x: 0,
|
2088
|
+
y: scrollTop
|
2089
|
+
});
|
2090
|
+
if (pos !== null) {
|
2091
|
+
const { anchor, head } = view.state.selection.main;
|
2092
|
+
setStateDebounced(id, {
|
2093
|
+
scrollTo: pos,
|
2094
|
+
selection: {
|
2095
|
+
anchor,
|
2096
|
+
head
|
2097
|
+
}
|
2117
2098
|
});
|
2118
|
-
if (pos !== null) {
|
2119
|
-
const { anchor, head } = view.state.selection.main;
|
2120
|
-
setStateDebounced(id, {
|
2121
|
-
scrollTo: pos,
|
2122
|
-
selection: {
|
2123
|
-
anchor,
|
2124
|
-
head
|
2125
|
-
}
|
2126
|
-
});
|
2127
|
-
}
|
2128
2099
|
}
|
2129
2100
|
}),
|
2130
|
-
|
2101
|
+
keymap4.of([
|
2131
2102
|
{
|
2132
2103
|
key: "ctrl-r",
|
2133
2104
|
run: (view) => {
|
2134
|
-
const
|
2135
|
-
if (
|
2136
|
-
view.dispatch(createEditorStateTransaction(
|
2105
|
+
const selection = state[view.state.facet(documentId)];
|
2106
|
+
if (selection) {
|
2107
|
+
view.dispatch(createEditorStateTransaction(selection));
|
2137
2108
|
}
|
2138
2109
|
return true;
|
2139
2110
|
}
|
2140
2111
|
}
|
2141
2112
|
])
|
2142
|
-
]
|
2113
|
+
];
|
2143
2114
|
};
|
2144
2115
|
|
2145
2116
|
// packages/ui/react-ui-editor/src/extensions/comments.ts
|
2146
|
-
var
|
2117
|
+
var __dxlog_file6 = "/home/runner/work/dxos/dxos/packages/ui/react-ui-editor/src/extensions/comments.ts";
|
2147
2118
|
var setComments = StateEffect3.define();
|
2148
2119
|
var setSelection = StateEffect3.define();
|
2149
2120
|
var setCommentState = StateEffect3.define();
|
@@ -2213,7 +2184,7 @@ var commentsDecorations = EditorView9.decorations.compute([
|
|
2213
2184
|
const range = comment.range;
|
2214
2185
|
if (!range) {
|
2215
2186
|
log4.warn("Invalid range:", range, {
|
2216
|
-
F:
|
2187
|
+
F: __dxlog_file6,
|
2217
2188
|
L: 144,
|
2218
2189
|
S: void 0,
|
2219
2190
|
C: (f, a) => f(...a)
|
@@ -2665,7 +2636,7 @@ import defaultsDeep2 from "lodash.defaultsdeep";
|
|
2665
2636
|
import merge from "lodash.merge";
|
2666
2637
|
import { generateName } from "@dxos/display-name";
|
2667
2638
|
import { log as log5 } from "@dxos/log";
|
2668
|
-
import { hexToHue, isNotFalsy as
|
2639
|
+
import { hexToHue, isNotFalsy as isNotFalsy2 } from "@dxos/util";
|
2669
2640
|
|
2670
2641
|
// packages/ui/react-ui-editor/src/extensions/focus.ts
|
2671
2642
|
import { StateEffect as StateEffect4, StateField as StateField6 } from "@codemirror/state";
|
@@ -2699,7 +2670,7 @@ var focus = [
|
|
2699
2670
|
];
|
2700
2671
|
|
2701
2672
|
// packages/ui/react-ui-editor/src/extensions/factories.ts
|
2702
|
-
var
|
2673
|
+
var __dxlog_file7 = "/home/runner/work/dxos/dxos/packages/ui/react-ui-editor/src/extensions/factories.ts";
|
2703
2674
|
var preventNewline = EditorState.transactionFilter.of((tr) => tr.newDoc.lines > 1 ? [] : tr);
|
2704
2675
|
var defaultBasicOptions = {
|
2705
2676
|
allowMultipleSelections: true,
|
@@ -2725,7 +2696,7 @@ var createBasicExtensions = (_props) => {
|
|
2725
2696
|
// NOTE: Doesn't catch errors in keymap functions.
|
2726
2697
|
EditorView12.exceptionSink.of((err) => {
|
2727
2698
|
log5.catch(err, void 0, {
|
2728
|
-
F:
|
2699
|
+
F: __dxlog_file7,
|
2729
2700
|
L: 96,
|
2730
2701
|
S: void 0,
|
2731
2702
|
C: (f, a) => f(...a)
|
@@ -2771,8 +2742,8 @@ var createBasicExtensions = (_props) => {
|
|
2771
2742
|
preventDefault: true,
|
2772
2743
|
run: () => true
|
2773
2744
|
}
|
2774
|
-
].filter(
|
2775
|
-
].filter(
|
2745
|
+
].filter(isNotFalsy2))
|
2746
|
+
].filter(isNotFalsy2);
|
2776
2747
|
};
|
2777
2748
|
var defaultThemeSlots = {
|
2778
2749
|
editor: {
|
@@ -2792,7 +2763,7 @@ var createThemeExtensions = ({ themeMode, styles: styles5, syntaxHighlighting: _
|
|
2792
2763
|
slots.content?.className && EditorView12.contentAttributes.of({
|
2793
2764
|
class: slots.content.className
|
2794
2765
|
})
|
2795
|
-
].filter(
|
2766
|
+
].filter(isNotFalsy2);
|
2796
2767
|
};
|
2797
2768
|
var createDataExtensions = ({ id, text, space, identity }) => {
|
2798
2769
|
const extensions = [];
|
@@ -2817,42 +2788,81 @@ var createDataExtensions = ({ id, text, space, identity }) => {
|
|
2817
2788
|
};
|
2818
2789
|
|
2819
2790
|
// packages/ui/react-ui-editor/src/extensions/folding.tsx
|
2820
|
-
import { codeFolding, foldGutter } from "@codemirror/language";
|
2791
|
+
import { codeFolding, foldGutter, foldedRanges, foldEffect } from "@codemirror/language";
|
2821
2792
|
import { EditorView as EditorView13 } from "@codemirror/view";
|
2822
2793
|
import React3 from "react";
|
2794
|
+
import { debounce as debounce3 } from "@dxos/async";
|
2823
2795
|
import { Icon } from "@dxos/react-ui";
|
2824
|
-
var folding = (
|
2825
|
-
|
2826
|
-
|
2827
|
-
|
2828
|
-
|
2829
|
-
|
2830
|
-
|
2831
|
-
|
2832
|
-
|
2833
|
-
|
2796
|
+
var folding = (state = {}) => {
|
2797
|
+
const setState = (id, foldState) => {
|
2798
|
+
state[id] = foldState;
|
2799
|
+
};
|
2800
|
+
const setStateDebounced = debounce3(setState, 1e3);
|
2801
|
+
let initialized = false;
|
2802
|
+
return [
|
2803
|
+
codeFolding({
|
2804
|
+
placeholderDOM: () => {
|
2805
|
+
return document.createElement("span");
|
2806
|
+
}
|
2807
|
+
}),
|
2808
|
+
foldGutter({
|
2809
|
+
markerDOM: (open) => {
|
2810
|
+
const el = createElement("div", {
|
2811
|
+
className: "flex h-full items-center"
|
2812
|
+
});
|
2813
|
+
return renderRoot(el, /* @__PURE__ */ React3.createElement(Icon, {
|
2814
|
+
icon: "ph--caret-right--regular",
|
2815
|
+
size: 3,
|
2816
|
+
classNames: [
|
2817
|
+
"mx-3 cursor-pointer",
|
2818
|
+
open && "rotate-90"
|
2819
|
+
]
|
2820
|
+
}));
|
2821
|
+
}
|
2822
|
+
}),
|
2823
|
+
EditorView13.theme({
|
2824
|
+
".cm-foldGutter": {
|
2825
|
+
opacity: 0.3,
|
2826
|
+
transition: "opacity 0.3s",
|
2827
|
+
width: "32px"
|
2828
|
+
},
|
2829
|
+
".cm-foldGutter:hover": {
|
2830
|
+
opacity: 1
|
2831
|
+
}
|
2832
|
+
}),
|
2833
|
+
EditorView13.updateListener.of(({ view }) => {
|
2834
|
+
const id = view.state.facet(documentId);
|
2835
|
+
if (!id) {
|
2836
|
+
return;
|
2837
|
+
}
|
2838
|
+
if (!initialized) {
|
2839
|
+
initialized = true;
|
2840
|
+
const foldState2 = state[id];
|
2841
|
+
if (foldState2?.foldedRanges?.length) {
|
2842
|
+
view.dispatch({
|
2843
|
+
effects: foldState2.foldedRanges.map((range) => foldEffect.of({
|
2844
|
+
from: range.from,
|
2845
|
+
to: range.to
|
2846
|
+
}))
|
2847
|
+
});
|
2848
|
+
}
|
2849
|
+
return;
|
2850
|
+
}
|
2851
|
+
const decorations = foldedRanges(view.state);
|
2852
|
+
const ranges = [];
|
2853
|
+
decorations.between(0, view.state.doc.length, (from, to) => {
|
2854
|
+
ranges.push({
|
2855
|
+
from,
|
2856
|
+
to
|
2857
|
+
});
|
2834
2858
|
});
|
2835
|
-
|
2836
|
-
|
2837
|
-
|
2838
|
-
|
2839
|
-
|
2840
|
-
|
2841
|
-
|
2842
|
-
}));
|
2843
|
-
}
|
2844
|
-
}),
|
2845
|
-
EditorView13.theme({
|
2846
|
-
".cm-foldGutter": {
|
2847
|
-
opacity: 0.3,
|
2848
|
-
transition: "opacity 0.3s",
|
2849
|
-
width: "32px"
|
2850
|
-
},
|
2851
|
-
".cm-foldGutter:hover": {
|
2852
|
-
opacity: 1
|
2853
|
-
}
|
2854
|
-
})
|
2855
|
-
];
|
2859
|
+
const foldState = {
|
2860
|
+
foldedRanges: ranges
|
2861
|
+
};
|
2862
|
+
setStateDebounced?.(id, foldState);
|
2863
|
+
})
|
2864
|
+
];
|
2865
|
+
};
|
2856
2866
|
|
2857
2867
|
// packages/ui/react-ui-editor/src/extensions/listener.ts
|
2858
2868
|
import { EditorView as EditorView14 } from "@codemirror/view";
|
@@ -4274,7 +4284,7 @@ var convertTreeToJson = (state) => {
|
|
4274
4284
|
import { syntaxTree as syntaxTree7 } from "@codemirror/language";
|
4275
4285
|
import { RangeSetBuilder as RangeSetBuilder3, StateEffect as StateEffect5 } from "@codemirror/state";
|
4276
4286
|
import { EditorView as EditorView19, Decoration as Decoration7, WidgetType as WidgetType5, ViewPlugin as ViewPlugin6 } from "@codemirror/view";
|
4277
|
-
import { invariant as
|
4287
|
+
import { invariant as invariant3 } from "@dxos/invariant";
|
4278
4288
|
import { mx as mx4 } from "@dxos/react-ui-theme";
|
4279
4289
|
|
4280
4290
|
// packages/ui/react-ui-editor/src/extensions/markdown/changes.ts
|
@@ -4733,7 +4743,7 @@ var TableWidget = class extends WidgetType4 {
|
|
4733
4743
|
};
|
4734
4744
|
|
4735
4745
|
// packages/ui/react-ui-editor/src/extensions/markdown/decorate.ts
|
4736
|
-
var
|
4746
|
+
var __dxlog_file8 = "/home/runner/work/dxos/dxos/packages/ui/react-ui-editor/src/extensions/markdown/decorate.ts";
|
4737
4747
|
var Unicode = {
|
4738
4748
|
emDash: "\u2014",
|
4739
4749
|
bullet: "\u2022",
|
@@ -4866,8 +4876,8 @@ var buildDecorations2 = (view, options, focus2) => {
|
|
4866
4876
|
const { state } = view;
|
4867
4877
|
const headerLevels = [];
|
4868
4878
|
const getHeaderLevels = (node, level) => {
|
4869
|
-
|
4870
|
-
F:
|
4879
|
+
invariant3(level > 0, void 0, {
|
4880
|
+
F: __dxlog_file8,
|
4871
4881
|
L: 178,
|
4872
4882
|
S: void 0,
|
4873
4883
|
A: [
|
@@ -4905,8 +4915,8 @@ var buildDecorations2 = (view, options, focus2) => {
|
|
4905
4915
|
listLevels.pop();
|
4906
4916
|
};
|
4907
4917
|
const getCurrentListLevel = () => {
|
4908
|
-
|
4909
|
-
F:
|
4918
|
+
invariant3(listLevels.length, void 0, {
|
4919
|
+
F: __dxlog_file8,
|
4910
4920
|
L: 200,
|
4911
4921
|
S: void 0,
|
4912
4922
|
A: [
|
@@ -5229,7 +5239,7 @@ var linkTooltip = (render) => {
|
|
5229
5239
|
// packages/ui/react-ui-editor/src/extensions/mention.ts
|
5230
5240
|
import { autocompletion as autocompletion2 } from "@codemirror/autocomplete";
|
5231
5241
|
import { log as log6 } from "@dxos/log";
|
5232
|
-
var
|
5242
|
+
var __dxlog_file9 = "/home/runner/work/dxos/dxos/packages/ui/react-ui-editor/src/extensions/mention.ts";
|
5233
5243
|
var mention = ({ debug, onSearch }) => {
|
5234
5244
|
return autocompletion2({
|
5235
5245
|
// TODO(burdon): Not working.
|
@@ -5244,7 +5254,7 @@ var mention = ({ debug, onSearch }) => {
|
|
5244
5254
|
log6.info("completion context", {
|
5245
5255
|
context
|
5246
5256
|
}, {
|
5247
|
-
F:
|
5257
|
+
F: __dxlog_file9,
|
5248
5258
|
L: 27,
|
5249
5259
|
S: void 0,
|
5250
5260
|
C: (f, a) => f(...a)
|
@@ -5381,8 +5391,8 @@ import { EditorView as EditorView20 } from "@codemirror/view";
|
|
5381
5391
|
import { useFocusableGroup } from "@fluentui/react-tabster";
|
5382
5392
|
import { useCallback as useCallback3, useEffect as useEffect2, useMemo as useMemo4, useRef, useState } from "react";
|
5383
5393
|
import { log as log7 } from "@dxos/log";
|
5384
|
-
import { getProviderValue, isNotFalsy as
|
5385
|
-
var
|
5394
|
+
import { getProviderValue, isNotFalsy as isNotFalsy3 } from "@dxos/util";
|
5395
|
+
var __dxlog_file10 = "/home/runner/work/dxos/dxos/packages/ui/react-ui-editor/src/hooks/useTextEditor.ts";
|
5386
5396
|
var instanceCount = 0;
|
5387
5397
|
var useTextEditor = (props = {}, deps = []) => {
|
5388
5398
|
const { id, initialValue, extensions, autoFocus, scrollTo, selection, moveToEndOfLine, debug } = useMemo4(() => getProviderValue(props), deps ?? []);
|
@@ -5397,7 +5407,7 @@ var useTextEditor = (props = {}, deps = []) => {
|
|
5397
5407
|
instanceId,
|
5398
5408
|
doc: initialValue?.length ?? 0
|
5399
5409
|
}, {
|
5400
|
-
F:
|
5410
|
+
F: __dxlog_file10,
|
5401
5411
|
L: 75,
|
5402
5412
|
S: void 0,
|
5403
5413
|
C: (f, a) => f(...a)
|
@@ -5423,13 +5433,13 @@ var useTextEditor = (props = {}, deps = []) => {
|
|
5423
5433
|
// NOTE: This doesn't catch errors in keymap functions.
|
5424
5434
|
EditorView20.exceptionSink.of((err) => {
|
5425
5435
|
log7.catch(err, void 0, {
|
5426
|
-
F:
|
5436
|
+
F: __dxlog_file10,
|
5427
5437
|
L: 97,
|
5428
5438
|
S: void 0,
|
5429
5439
|
C: (f, a) => f(...a)
|
5430
5440
|
});
|
5431
5441
|
})
|
5432
|
-
].filter(
|
5442
|
+
].filter(isNotFalsy3)
|
5433
5443
|
});
|
5434
5444
|
view2 = new EditorView20({
|
5435
5445
|
parent: parentRef.current,
|
@@ -5455,7 +5465,7 @@ var useTextEditor = (props = {}, deps = []) => {
|
|
5455
5465
|
log7("destroy", {
|
5456
5466
|
id
|
5457
5467
|
}, {
|
5458
|
-
F:
|
5468
|
+
F: __dxlog_file10,
|
5459
5469
|
L: 134,
|
5460
5470
|
S: void 0,
|
5461
5471
|
C: (f, a) => f(...a)
|
@@ -5472,7 +5482,7 @@ var useTextEditor = (props = {}, deps = []) => {
|
|
5472
5482
|
scrollTo,
|
5473
5483
|
selection
|
5474
5484
|
}, {
|
5475
|
-
F:
|
5485
|
+
F: __dxlog_file10,
|
5476
5486
|
L: 143,
|
5477
5487
|
S: void 0,
|
5478
5488
|
C: (f, a) => f(...a)
|
@@ -5498,7 +5508,7 @@ var useTextEditor = (props = {}, deps = []) => {
|
|
5498
5508
|
autoFocus,
|
5499
5509
|
view
|
5500
5510
|
]);
|
5501
|
-
const
|
5511
|
+
const focusableGroupAttrs = useFocusableGroup({
|
5502
5512
|
tabBehavior: "limited",
|
5503
5513
|
ignoreDefaultKeydown: {
|
5504
5514
|
Escape: view?.state.facet(editorInputMode).noTabster
|
@@ -5517,15 +5527,14 @@ var useTextEditor = (props = {}, deps = []) => {
|
|
5517
5527
|
}, [
|
5518
5528
|
view
|
5519
5529
|
]);
|
5520
|
-
const focusAttributes = {
|
5521
|
-
tabIndex: 0,
|
5522
|
-
...focusableGroup,
|
5523
|
-
onKeyUp: handleKeyUp
|
5524
|
-
};
|
5525
5530
|
return {
|
5526
5531
|
parentRef,
|
5527
5532
|
view,
|
5528
|
-
focusAttributes
|
5533
|
+
focusAttributes: {
|
5534
|
+
tabIndex: 0,
|
5535
|
+
...focusableGroupAttrs,
|
5536
|
+
onKeyUp: handleKeyUp
|
5537
|
+
}
|
5529
5538
|
};
|
5530
5539
|
};
|
5531
5540
|
export {
|
@@ -5565,7 +5574,6 @@ export {
|
|
5565
5574
|
createDataExtensions,
|
5566
5575
|
createEditorAction,
|
5567
5576
|
createEditorActionGroup,
|
5568
|
-
createEditorStateStore,
|
5569
5577
|
createEditorStateTransaction,
|
5570
5578
|
createElement,
|
5571
5579
|
createExternalCommentSync,
|